OOP历史:演变自20世纪60年代的
Simula
、70年代的SmallTalk
、80年代的Clascal
以及其他相关语言。C++
、Java
、Python
和Objective-C
等现代编程语言都从这个早期的语言中获得了灵感。
3.1 间接
只要在多加一层间接,计算机科学中就没有解决不了的问题
。
说明:指的就是面向对象的
多态性
。
原理:在程序运行期间,通过指针间接获取某个值,而不是直接获取(指针指向
的变化对程序员不可见)。
3.1.1 变量与间接
说明:基本变量就是间接思想的一种实际应用。
1 |
|
3.1.2 使用文件名的间接
说明:程序中使用文件(而不是写死在代码中)也是间接思想的运用。
技巧:xcode
中运行程序时提供文件路径的方式
- 打开设置面板:Product(菜单)-> Scheme -> Edit Scheme
- 在面板中添加参数:Arguments -> Arguments Passed On Launch—>点击
+
添加
1 |
|
3.2 在面向对象编程中使用间接
说明:
OOP
的核心在于使用间接来调用代码(而不是直接调用函数)
3.2.1 过程式编程
说明:在过程式编程中,数据通常保存在简单的数据结构中。要花时间连接数据和用来处理数据的函数。
语言举例:BASIC
、C
、Tcl
和Perl
1 |
|
1 | 2016-01-02 00:50:43.911 3.2.1-procedureOriented[834:55458] drawing a circle at (0 0 30 10) in red |
3.2.2 实现面向对象编程
说明:过程式编程建立在函数之上,数据为函数服务,而面向对象编程则以程序的数据为中心,函数为数据服务。
原理:数据通过间接方式
引用相应代码对数据进行操作(数据能够知道如何查找相应的函数)。
id(标识符)
说明:
identifier
,是一种泛型,可以用来定义引用任何类型对象的变量。
发送消息
说明:通知对象执行某种操作,也叫做
调用方法
类
说明:不同于其他
OOP
系统,在O-C
中,如果在运行时改变某个类,则该类的所有对象会自动继承这些变化
。
3.3 有关术语
说明:有关
面向对象
的术语
术语 | 说明 | 语法 | 备注 |
---|---|---|---|
类(class) | 一种表示对象类型的结构体 | 类名首字母大写 | 对象通过它的类来获取自身的各种信息 |
对象或实例(object) | 一种包含值和指向其类的隐藏指针的结构体 | 指向对象的变量通常首字母不要大些 | |
消息(message) | 对象可以执行的操作,用于通知对象做什么 | ||
方法(method) | 响应消息运行的代码 | 根据对象的类,消息可以调用不同的方法 | |
方法调度(method dispatcher) | 用于推测执行什么方法以响应某个特定的消息 | ||
接口(interface) | 类为对象提供的特性描述 | ||
实现(implementation) | 使接口能正常工作的代码 |
3.4 Object-C语言中的OOP
3.4.1 @interface部分
说明:定义类的公共接口,真正运行的代码位于
@implementation
中。
用途:在特定类的对象被创建时,为编译器提供有关该类的信息,尤其是对象的数据成员及其提供的功能。
组成:语法上包含以下几个部分
- 继承其它
interface
- 实现
protocol
- 实例变量
- 方法声明
1 | @interface 类名: 父类名 { |
注意:在声明方法时,如果方法有参数,则需要冒号,否则不需要。
1 | // Circle类 |
3.4.2 @implementation部分
说明:
@implementation
是一个编译器指令,表明将为某个类提供代码
- 方法的定义不必按照在
@interface
指令中的顺序出现- 可以定义没有在
@interface
中声明过的方法- 同一个类中,方法的参数名不可以和实例属性名相同,否则方法被调用时会覆盖实例属性的值
扩展:
- 实例变量名:如果实例变量取一个和方法名相同的名字,
Cocoa
还可以发挥出某些神奇的威力- 运行时:
O-C运行时
是指用户应用程序时,支持这些应用程序的代码块- self:类的方法被调用时,一个名为
self
的秘密隐藏参数将被传递给接受对象,而这个参数引用的就是该接收对象
1 | @implementation Circle |
3.4.3 实例化对象
说明:实例化对象时,需要分配内存,然后将这些内存初始化并保存为有用的默认值。
语法:向相应的类
(或已经存在的对象
)发送new
消息,该类接收并处理完new
消息后,我们就会得到一个可以使用的新对象实例。
1 |
|
3.4.4 扩展 Shapes-Object 程序
说明:软件实体应该对扩展开放,而对修改关闭